//前序
vector<int> preorderTraversal(TreeNode* root) {
        // 定义返回结果向量以及遍历工作栈
        vector<int> pvec;
        stack<TreeNode*>st;
        //根节点为空，则直接返回
        if(root == nullptr) return pvec;
        // 工作节点
        TreeNode* node = root;
        while(!st.empty() || node){	
            //沿着根节点的左分支一直下沉
            while(node){
                st.push(node);
                //确保先处理根节点
                pvec.push_back(node->val);
                node = node->left;
            }
            //当前节点再没有左子树，处理其右子树
            TreeNode* cur = st.top();
            st.pop();
            node = cur->right;
        }
        return pvec;
    }
vector<int> preorderTraversal(TreeNode* root) {
        vector<int> result;
        stack<TreeNode*> st;
        if (root != NULL) st.push(root);
        while (!st.empty()) {
            TreeNode* node = st.top();
            if (node != NULL) {
                st.pop();
                if (node->right) st.push(node->right);  // 右
                if (node->left) st.push(node->left);    // 左
                st.push(node);                          // 中
                st.push(NULL);
            } else {
                st.pop();
                node = st.top();
                st.pop();
                result.push_back(node->val);
            }
        }
        return result;
    }
//中序
vector<int> inorderTraversal(TreeNode* root) {
        vector<int> ivec;
        stack<TreeNode*> st;
        TreeNode *node = root;
        while(node ||!st.empty()){
            // 沿着左分支一直下沉
            while(node != nullptr){
                st.push(node);
                node = node->left;
            }
            // 先打印然后再处理右子树
            TreeNode *cur = st.top();
            st.pop();
            ivec.push_back(cur->val);
            node = cur->right;
        }
        return ivec;
    }
vector<int> inorderTraversal(TreeNode* root) {
        vector<int> result;
        stack<TreeNode*> st;
        if (root != NULL) st.push(root);
        while (!st.empty()) {
            TreeNode* node = st.top();
            if (node != NULL) {
                st.pop(); // 将该节点弹出，避免重复操作，下面再将右中左节点添加到栈中
                if (node->right) st.push(node->right);  // 添加右节点（空节点不入栈）

                st.push(node);                          // 添加中节点
                st.push(NULL); // 中节点访问过，但是还没有处理，加入空节点做为标记。

                if (node->left) st.push(node->left);    // 添加左节点（空节点不入栈）
            } else { // 只有遇到空节点的时候，才将下一个节点放进结果集
                st.pop();           // 将空节点弹出
                node = st.top();    // 重新取出栈中元素
                st.pop();
                result.push_back(node->val); // 加入到结果集
            }
        }
        return result;
    }

//后序——先前序再倒置
class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {

        vector<int> res;
        if(!root) return res;

        stack<TreeNode*> s;
        TreeNode* cur = root;
        while(!s.empty() || cur){
            while(cur){
                res.emplace_back(cur->val);
                s.push(cur);
                cur = cur->right;
            }
            TreeNode* node = s.top();
            s.pop();
            cur = node->left;
        }
        reverse(res.begin(), res.end());
        return res;
    }
};

vector<int> postorderTraversal(TreeNode* root) {
        vector<int> result;
        stack<TreeNode*> st;
        if (root != NULL) st.push(root);
        while (!st.empty()) {
            TreeNode* node = st.top();
            if (node != NULL) {
                st.pop();
                st.push(node);                          // 中
                st.push(NULL);

                if (node->right) st.push(node->right);  // 右
                if (node->left) st.push(node->left);    // 左

            } else {
                st.pop();
                node = st.top();
                st.pop();
                result.push_back(node->val);
            }
        }
        return result;
    }

vector<int> postorderTraversal(TreeNode* root) {
        stack<TreeNode*> st;
        vector<int> result;
        if (root == NULL) return result;
        st.push(root);
        while (!st.empty()) {
            TreeNode* node = st.top();
            st.pop();
            result.push_back(node->val);
            if (node->left) st.push(node->left); // 相对于前序遍历，这更改一下入栈顺序 （空节点不入栈）
            if (node->right) st.push(node->right); // 空节点不入栈
        }
        reverse(result.begin(), result.end()); // 将结果反转之后就是左右中的顺序了
        return result;
    }

//层次
vector<vector<int>> levelOrder(TreeNode* root) {
        vector<int> res;
        queue<TreeNode*> qt;
        vector<vector<int> > ve;
        // 根节点入队
        if(root != nullptr) qt.push(root);
        while(!qt.empty()){
            // 每一行定义一个暂存本行变量的vector
            vector<int> vec;
            //size保存当前遍历的一行的元素个数
            int _size = qt.size();
            while(_size--){
                TreeNode* node = qt.front();
                qt.pop();
                vec.push_back(node->val);
                // 出队元素的左右子节点入队
                if(node->left != nullptr)   qt.push(node->left);
                if(node->right != nullptr)  qt.push(node->right);
            }
            ve.push_back(vec);
        }
        return ve;
    }
